{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "dRPKTgiRTimq"
   },
   "source": [
    "# Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Hiyd_BaQTmdE"
   },
   "outputs": [],
   "source": [
    "from fastai.vision import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "1W0kPwv-TwlF"
   },
   "outputs": [],
   "source": [
    "path = Path('path/to/spectrograms/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "zRPRn9w5TxzU"
   },
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "data = ImageDataBunch.from_folder(path, train=\".\", valid_pct=0.2,\n",
    "        ds_tfms=get_transforms(), size=224, num_workers=0).normalize(imagenet_stats)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "6aEb9-01T4KP",
    "outputId": "58f84f7d-7ade-4534-ff7a-7f6066a39396"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['bonafide', 'spoof']"
      ]
     },
     "execution_count": 18,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "8QT6mME-T9Ky"
   },
   "outputs": [],
   "source": [
    "learn = create_cnn(data, models.resnet34, metrics=accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 159
    },
    "colab_type": "code",
    "id": "Sk_2d1alT__5",
    "outputId": "45293350-b173-452e-a8fc-9cb6c9626b6e"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "Total time: 6:34:21 <p><table style='width:300px; margin-bottom:10px'>\n",
       "  <tr>\n",
       "    <th>epoch</th>\n",
       "    <th>train_loss</th>\n",
       "    <th>valid_loss</th>\n",
       "    <th>accuracy</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>1</th>\n",
       "    <th>0.209063</th>\n",
       "    <th>0.186723</th>\n",
       "    <th>0.918426</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>2</th>\n",
       "    <th>0.169386</th>\n",
       "    <th>0.148646</th>\n",
       "    <th>0.933241</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>3</th>\n",
       "    <th>0.134832</th>\n",
       "    <th>0.111896</th>\n",
       "    <th>0.948148</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>4</th>\n",
       "    <th>0.127857</th>\n",
       "    <th>0.106812</th>\n",
       "    <th>0.950556</th>\n",
       "  </tr>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "OcjPnksEUD4W"
   },
   "outputs": [],
   "source": [
    "learn.save('stage-1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "y6nBhz2FUIPu"
   },
   "outputs": [],
   "source": [
    "learn.unfreeze()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "Q_F2M6k8ULpN",
    "outputId": "f5b322b6-5db8-4a92-98f1-d40ec589ac91"
   },
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n"
     ]
    }
   ],
   "source": [
    "learn.lr_find()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 379
    },
    "colab_type": "code",
    "id": "v_jqylNLUOrb",
    "outputId": "facc7a39-ab8b-497d-87f0-a4884617b434"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Min numerical gradient: 2.51E-05\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x396 with 1 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 154
    },
    "colab_type": "code",
    "id": "1JHXJpiMUR0H",
    "outputId": "b8eb5121-28fd-4afd-ec3c-c9286924c70b"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "        <style>\n",
       "            /* Turns off some styling */\n",
       "            progress {\n",
       "                /* gets rid of default border in Firefox and Opera. */\n",
       "                border: none;\n",
       "                /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "                background-size: auto;\n",
       "            }\n",
       "            .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "                background: #F44336;\n",
       "            }\n",
       "        </style>\n",
       "      <progress value='3' class='' max='4', style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      75.00% [3/4 1:39:35<33:11]\n",
       "    </div>\n",
       "    \n",
       "<table style='width:300px; margin-bottom:10px'>\n",
       "  <tr>\n",
       "    <th>epoch</th>\n",
       "    <th>train_loss</th>\n",
       "    <th>valid_loss</th>\n",
       "    <th>accuracy</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>1</th>\n",
       "    <th>0.117509</th>\n",
       "    <th>0.095100</th>\n",
       "    <th>0.955926</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>2</th>\n",
       "    <th>0.105924</th>\n",
       "    <th>0.092530</th>\n",
       "    <th>0.956389</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>3</th>\n",
       "    <th>0.111739</th>\n",
       "    <th>0.091010</th>\n",
       "    <th>0.956481</th>\n",
       "  </tr>\n",
       "</table>\n",
       "\n",
       "\n",
       "    <div>\n",
       "        <style>\n",
       "            /* Turns off some styling */\n",
       "            progress {\n",
       "                /* gets rid of default border in Firefox and Opera. */\n",
       "                border: none;\n",
       "                /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
       "                background-size: auto;\n",
       "            }\n",
       "            .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
       "                background: #F44336;\n",
       "            }\n",
       "        </style>\n",
       "      <progress value='286' class='' max='675', style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      42.37% [286/675 13:17<18:05 0.1088]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(4, max_lr=slice(1e-6,7e-6))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "otEOSEtRUVzX"
   },
   "outputs": [],
   "source": [
    "learn.save('stage-2')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "BPYVLZbUcZrB"
   },
   "outputs": [],
   "source": [
    "learn.load('stage-2')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 159
    },
    "colab_type": "code",
    "id": "xUVX66AIcZda",
    "outputId": "820faec7-ce6b-48fe-9a30-561ff840950b"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "Total time: 1:29:38 <p><table style='width:300px; margin-bottom:10px'>\n",
       "  <tr>\n",
       "    <th>epoch</th>\n",
       "    <th>train_loss</th>\n",
       "    <th>valid_loss</th>\n",
       "    <th>accuracy</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>1</th>\n",
       "    <th>0.101281</th>\n",
       "    <th>0.083127</th>\n",
       "    <th>0.958704</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>2</th>\n",
       "    <th>0.099710</th>\n",
       "    <th>0.079067</th>\n",
       "    <th>0.965833</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>3</th>\n",
       "    <th>0.082995</th>\n",
       "    <th>0.067647</th>\n",
       "    <th>0.968241</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>4</th>\n",
       "    <th>0.076074</th>\n",
       "    <th>0.063938</th>\n",
       "    <th>0.971852</th>\n",
       "  </tr>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(4, max_lr=slice(1e-5,1e-4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "R7ZZyRrFcveE"
   },
   "outputs": [],
   "source": [
    "learn.save('stage-3')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "b1MV9CVaUZ1o"
   },
   "outputs": [],
   "source": [
    "gc.collect()"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "name": "asvspoof physical access.ipynb",
   "provenance": [],
   "toc_visible": true,
   "version": "0.3.2"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
